perm filename PIXNIC.SAI[VIS,HPM]5 blob sn#148371 filedate 1975-02-26 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	REQUIRE "PIXSUB.REL[VIS,HPM]" LOAD_MODULE
C00016 ENDMK
C⊗;
REQUIRE "PIXSUB.REL[VIS,HPM]" LOAD_MODULE;
REQUIRE "TVSIX.REL[1,PDQ]" LOAD_MODULE;
EXTERNAL PROCEDURE MAKTAB(REFERENCE INTEGER PICTURE);
EXTERNAL INTEGER PROCEDURE PIXEL(REFERENCE INTEGER PIX; INTEGER I,J);
EXTERNAL PROCEDURE PUTEL(REFERENCE INTEGER PIX; INTEGER I,J,VALUE);

INTEGER PROCEDURE PFLDIM(STRING FILNAM);
  comment  returns the size of the picture FILNAM on disk.
		used for allocating arrays in preparation for
		actually reading them. Returns 0 on failure.;
 BEGIN
 INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER ARRAY BUF[0:'177];

 STRING PROCEDURE DEV(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    T←"";
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
    END;

 STRING PROCEDURE NAM(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
    END;

 OPEN(10,DEV(FILNAM),'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
 LOOKUP(10,NAM(FILNAM),XXFLAG);
 IF XXFLAG THEN
  BEGIN
  CLOSE(10);
  RETURN(0);
  END
 ELSE
  BEGIN
  INTEGER K,KK;
  ARRYIN(10,BUF[0],'200); CLOSE(10);
  KK←0;
  FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←K;
  IF BUF[0]≠-1 ∨ KK=0 THEN RETURN(0);
  BYBI←BUF[1];
  LNBY←BUF[6]-BUF[5]+1;
  PCLN←BUF[4]-BUF[3]+1;
  LNWD←BUF[2];
  LNBYA←LNWD*(36%BYBI);
  PCWD←LNWD*PCLN;
  XXPICLOC←(BUF[KK] LAND '777777)-'200;
  RETURN(12+PCLN+LNBYA+PCWD);
  END;
 END;

INTEGER PROCEDURE GETPFL(STRING FILNAM; REFERENCE INTEGER PICTURE);
  comment  read the picture in file FILNAM into area of core whose first
		word is PICTURE. PFLDIM(FILNAM) words are needed.
		Returns picture size of success, 0 on failure.;
 BEGIN
 INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 INTEGER ARRAY BUF[0:'177];

 STRING PROCEDURE DEV(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    T←"";
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
    END;

 STRING PROCEDURE NAM(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
    END;

 OPEN(10,DEV(FILNAM),'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
 LOOKUP(10,NAM(FILNAM),XXFLAG);
 IF XXFLAG THEN
  BEGIN
  CLOSE(10);
  RETURN(0);
  END
 ELSE
  BEGIN
  INTEGER K,KK;
  ARRYIN(10,BUF[0],'200);
  KK←0;
  FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←K;
  IF BUF[0]≠-1 ∨ KK=0 THEN RETURN(0);
  L←LOCATION(PICTURE);
  MEMORY[L+9]←BYBI←BUF[1];
  MEMORY[L+5]←LNBY←BUF[6]-BUF[5]+1;
  MEMORY[L+0]←PCLN←BUF[4]-BUF[3]+1;
  MEMORY[L+4]←LNWD←BUF[2];
  MEMORY[L+7]←WDBY←36%BYBI;
  MEMORY[L+6]←LNBYA←LNWD*WDBY;
  MEMORY[L+1]←PCWD←PCLN*LNWD;
  MEMORY[L+2]←PCBY←PCLN*LNBY;
  MEMORY[L+3]←PCBYA←PCLN*LNBYA;
  MEMORY[L+8]←WDBI←WDBY*BYBI;
  MEMORY[L+10]←12+PCLN+L;
  MAKTAB(PICTURE);
  XXPICLOC←(BUF[KK] LAND '777777)-'200;
  FOR I←1 STEP 1 UNTIL XXPICLOC DO WORDIN(10);
  ARRYIN(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
  CLOSE(10);
  RETURN(12+PCLN+LNBYA+PCWD);
  END;
 END;


INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS);
  comment  returns the size of the array needed to hold a hypothetical
		picture HEIGHT scanlines by WIDTH pixels per scanline
		by BITS bits per pixel.;
 BEGIN
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER L;
 BYBI←BITS;
 LNBY←WIDTH;
 PCLN←HEIGHT;
 WDBY←36%BYBI;
 LNWD←(LNBY+WDBY-1)%WDBY;
 LNBYA←LNWD*WDBY;
 PCWD←PCLN*LNWD;
 RETURN(12+PCLN+LNBYA+PCWD);
 END;

INTEGER PROCEDURE MAKPIX(INTEGER HEIGHT,WIDTH,BITS; REFERENCE INTEGER PICTURE);
  comment  actually creates an empty picture HEIGHT by WIDTH by BITS in
		the area of core beginning with PICTURE. Returns its size.;
 BEGIN
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 L←LOCATION(PICTURE);
 MEMORY[L+9]←BYBI←BITS;
 MEMORY[L+5]←LNBY←WIDTH;
 MEMORY[L+0]←PCLN←HEIGHT;
 MEMORY[L+7]←WDBY←36%BYBI;
 MEMORY[L+4]←LNWD←(LNBY+WDBY-1)%WDBY;
 MEMORY[L+6]←LNBYA←LNWD*WDBY;
 MEMORY[L+1]←PCWD←PCLN*LNWD;
 MEMORY[L+2]←PCBY←PCLN*LNBY;
 MEMORY[L+3]←PCBYA←PCLN*LNBYA;
 MEMORY[L+8]←WDBI←WDBY*BYBI;
 MEMORY[L+10]←12+PCLN+L;
 MAKTAB(PICTURE);
 RETURN(12+PCLN+LNBYA+PCWD);
 END;
 
INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE; STRING FILNAM);
  comment  write out the picture in the core area starting with
		PICTURE, creating a file called FILNAM. Returns
		the size of the original file on success, else 0.;
 BEGIN
 INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 INTEGER ARRAY BUF[0:'177];

 STRING PROCEDURE DEV(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    T←"";
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
    END;

 STRING PROCEDURE NAM(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
    END;

 OPEN(10,DEV(FILNAM),'10,0,2,XXCOUNT,XXBRCHAR,XXEOF);
 ENTER(10,NAM(FILNAM),XXFLAG);
 IF XXFLAG THEN
  BEGIN
  CLOSE(10);
  RETURN(0);
  END
 ELSE
  BEGIN
  L←LOCATION(PICTURE);
  BUF[0]←-1;
  BUF[1]←BYBI←MEMORY[L+9];
  BUF[2]←LNWD←MEMORY[L+4];
  BUF[3]←1; BUF[4]←PCLN←MEMORY[L+0];
  BUF[5]←1; BUF[6]←LNBY←MEMORY[L+5];
  BUF[7]←((-(PCWD←MEMORY[L+1])) LSH 18) LOR '200;
  WDBY←36%BYBI;
  LNWD←(LNBY+WDBY-1)%WDBY;
  LNBYA←LNWD*WDBY;
  ARRYOUT(10,BUF[0],'200);
  ARRYOUT(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
  CLOSE(10);
  RETURN(12+PCLN+LNBYA+PCWD);
  END;
 END;


INTEGER PROCEDURE CAMPIX(INTEGER CAM,YEDGE,XEDGE,SUMS,CLPINC;
					REFERENCE INTEGER PICTURE);
    comment  read a picture from camera CAM of size defined by array PICTURE
                  the area of core beginning with PICTURE. Upper left hand
                  corner is at PICX,PICY. SUMS and CLPINC are averaging params.;
   BEGIN
   INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI,LINTAB;
   INTEGER L;
   EXTERNAL INTEGER ERROR,TVCAM;

   L←LOCATION(PICTURE);
   PCLN←MEMORY[L+0];
   PCWD←MEMORY[L+1];
   LNWD←MEMORY[L+4];
   LNBY←MEMORY[L+5];
   LNBYA←MEMORY[L+6];
   BYBI←MEMORY[L+9];
   LINTAB←MEMORY[L+11];

   ERROR←1; TVCAM←CAM;

   IF SUMS>1 ∨ CLPINC<8 ∨ BYBI≠4 THEN
      BEGIN
     comment  use Quam's general picture taker;
      EXTERNAL PROCEDURE TVSIX(INTEGER ARRAY PARS; INTEGER SUMS,CLPINC);
      EXTERNAL PROCEDURE PICREL(INTEGER ARRAY PIC);
      DEFINE SCALEX="0",SCALEY="1",POSX="2",POSY="3",SIZEX="4",SIZEY="5",
          SIZEL="6",PTR="7",NAME="8",BIT="9",GAIN="10",OFFSET="11";
          comment  for interfacing quam internal format;
      INTEGER ARRAY PIC[0:15];
      PIC[POSX]←XEDGE; PIC[POSY]←YEDGE;
      PIC[BIT]←BYBI;
      PIC[SIZEX]←LNBY;
      PIC[SIZEY]←PCLN;
      PIC[SIZEL]←LNWD;
      TVSIX(PIC,SUMS,CLPINC);
      ARRBLT(MEMORY[LINTAB],MEMORY[PIC[PTR] LAND '777777],PCWD);
      PICREL(PIC);
      END
   ELSE
      BEGIN
      EXTERNAL PROCEDURE TVIN;
      EXTERNAL INTEGER BCLIP,TCLIP,FLINE,LLINE,LSIDE,RSIDE,TVWORD;
      BCLIP←7; TCLIP←0;
      FLINE←YEDGE; LLINE←FLINE+PCLN-1;
      LSIDE←XEDGE; RSIDE←LSIDE+LNBY-1;
      TVWORD←((-PCWD) LSH 18) LOR (LINTAB-1);
      TVIN;
      END;
   RETURN(12+PCLN+LNBYA+PCWD);
   END;



DEFINE PCLN=0;  comment index of word in a picture file containing
			number of scanlines in the picture.
DEFINE PCWD=1;	comment number of words in the picture;
DEFINE PCBY=2;	comment number of valid bytes in the picture;
DEFINE PCBYA=3;	comment no. of bytes including the nulls at the end of lines;
DEFINE LNWD=4;	comment no. of words per scanline;
DEFINE LNBY=5;	comment no. of valid bytes per scanline;
DEFINE LNBYA=6;	comment no. of bytes per scanline, including the nulls;
DEFINE WDBY=7;	comment no. of bytes per word;
DEFINE WDBI=8;	comment no. of bits containing data in a word;
DEFINE BYBI=9;	comment no. of bits per byte;
DEFINE BPTAB=10; comment address of second entry in byte pntr. table;
DEFINE LINTAB=11; comment actual address of the first entry in the row table;